{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# A Post Office – A Real Life Story\n",
    "\n",
    "*Paul Bayer, 2019-11-08, v0.3*\n",
    "\n",
    "Let us begin with an everyday story: there is a small post office with one clerk serving the arriving customers. Customers have differing wishes leading to different serving times, from `1 - 5 minutes`. We have to add a little variation to serving times counting for variation in customer habits and clerk performance. The arrival rate of customers is about 18 per hour, every `3.33 minutes` or `3 minutes, 20 seconds` on average. Our post office is small and customer patience is limited, so queue length is limited to 5 customers. \n",
    "\n",
    "We have provided 10% extra capacity, so our expectation is that there should not be too many customers discouraged for long waiting times or for full queues.\n",
    "\n",
    "![post office](../src/images/PostOffice.png)\n",
    "\n",
    "Let's do a process-based simulation using [`DiscreteEvents`](https://github.com/pbayer/DiscreteEvents.jl). We need \n",
    "\n",
    "1. a source: all the **people**, providing an unlimited supply for customers,\n",
    "2. **customers** with their demands and their limited patience,\n",
    "3. a **queue** and\n",
    "4. our good old **clerk**."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "First we must load the needed modules, describe a customer and define some needed helper functions. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "logevent (generic function with 1 method)"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "using DiscreteEvents, Random, Distributions, DataFrames\n",
    "\n",
    "mutable struct Customer\n",
    "    id::Int64\n",
    "    arrival::Float64\n",
    "    request::Int64\n",
    "\n",
    "    Customer(n::Int64, arrival::Float64) = new(n, arrival, rand(DiscreteUniform(1, 5)))\n",
    "end\n",
    "\n",
    "full(q::Channel) = length(q.data) >= q.sz_max\n",
    "logevent(nr, queue::Channel, info::AbstractString, wt::Number) =\n",
    "    push!(df, (round(τ(), digits=2), nr, length(queue.data), info, wt))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Then we define functions for our processes: people and clerk."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "clerk (generic function with 1 method)"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "function people(output::Channel, β::Float64)\n",
    "    i = 1\n",
    "    while true\n",
    "        Δt = rand(Exponential(β))\n",
    "        delay!(Δt)\n",
    "        if !full(output)\n",
    "            put!(output, Customer(i, τ()))\n",
    "            logevent(i, output, \"enqueues\", 0)\n",
    "         else\n",
    "            logevent(i, output, \"leaves - queue is full!\", -1)\n",
    "        end\n",
    "        i += 1\n",
    "    end\n",
    "end\n",
    "\n",
    "function clerk(input::Channel)\n",
    "    cust = take!(input)\n",
    "    Δt = cust.request + randn()*0.2\n",
    "    logevent(cust.id, input, \"now being served\", τ() - cust.arrival)\n",
    "    delay!(Δt)\n",
    "    logevent(cust.id, input, \"leaves\", τ() - cust.arrival)\n",
    "end"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Then we have to create out data, register and startup the processes:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "reset!(𝐶)  # for repeated runs it is easier if we reset our central clock here\n",
    "Random.seed!(2019)  # seed random number generator for reproducibility\n",
    "queue = Channel(5)  # thus we determine the max size of the queue\n",
    "\n",
    "df = DataFrame(time=Float64[], cust=Int[], qlen=Int64[], status=String[], wtime=Float64[])\n",
    "\n",
    "process!(𝐶, SimProcess(1, people, queue, 3.333)) # register the functions as processes\n",
    "process!(𝐶, SimProcess(2, clerk, queue))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Then we can simply run the simulation. We assume our time unit being minutes, so we run for 600 units:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "run! finished with 338 clock events, 0 sample steps, simulation time: 600.0\n",
      "0 customers yet in queue\n"
     ]
    }
   ],
   "source": [
    "println(run!(𝐶, 600))\n",
    "println(\"$(length(queue.data)) customers yet in queue\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Our table has registered it all:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<table class=\"data-frame\"><thead><tr><th></th><th>time</th><th>cust</th><th>qlen</th><th>status</th><th>wtime</th></tr><tr><th></th><th>Float64</th><th>Int64</th><th>Int64</th><th>String</th><th>Float64</th></tr></thead><tbody><p>505 rows × 5 columns</p><tr><th>1</th><td>1.2</td><td>1</td><td>1</td><td>enqueues</td><td>0.0</td></tr><tr><th>2</th><td>1.2</td><td>1</td><td>0</td><td>now being served</td><td>0.0</td></tr><tr><th>3</th><td>5.46</td><td>2</td><td>1</td><td>enqueues</td><td>0.0</td></tr><tr><th>4</th><td>5.5</td><td>3</td><td>2</td><td>enqueues</td><td>0.0</td></tr><tr><th>5</th><td>6.19</td><td>1</td><td>2</td><td>leaves</td><td>4.99532</td></tr><tr><th>6</th><td>6.19</td><td>2</td><td>1</td><td>now being served</td><td>0.737497</td></tr><tr><th>7</th><td>7.99</td><td>4</td><td>2</td><td>enqueues</td><td>0.0</td></tr><tr><th>8</th><td>8.81</td><td>2</td><td>2</td><td>leaves</td><td>3.35581</td></tr><tr><th>9</th><td>8.81</td><td>3</td><td>1</td><td>now being served</td><td>3.30971</td></tr><tr><th>10</th><td>12.33</td><td>5</td><td>2</td><td>enqueues</td><td>0.0</td></tr><tr><th>11</th><td>12.98</td><td>3</td><td>2</td><td>leaves</td><td>7.4733</td></tr><tr><th>12</th><td>12.98</td><td>4</td><td>1</td><td>now being served</td><td>4.98585</td></tr><tr><th>13</th><td>13.73</td><td>4</td><td>1</td><td>leaves</td><td>5.74268</td></tr><tr><th>14</th><td>13.73</td><td>5</td><td>0</td><td>now being served</td><td>1.39837</td></tr><tr><th>15</th><td>15.72</td><td>6</td><td>1</td><td>enqueues</td><td>0.0</td></tr><tr><th>16</th><td>17.12</td><td>7</td><td>2</td><td>enqueues</td><td>0.0</td></tr><tr><th>17</th><td>17.73</td><td>5</td><td>2</td><td>leaves</td><td>5.3967</td></tr><tr><th>18</th><td>17.73</td><td>6</td><td>1</td><td>now being served</td><td>2.00988</td></tr><tr><th>19</th><td>20.0</td><td>8</td><td>2</td><td>enqueues</td><td>0.0</td></tr><tr><th>20</th><td>20.76</td><td>9</td><td>3</td><td>enqueues</td><td>0.0</td></tr><tr><th>21</th><td>23.26</td><td>6</td><td>3</td><td>leaves</td><td>7.53774</td></tr><tr><th>22</th><td>23.26</td><td>7</td><td>2</td><td>now being served</td><td>6.13554</td></tr><tr><th>23</th><td>25.43</td><td>10</td><td>3</td><td>enqueues</td><td>0.0</td></tr><tr><th>24</th><td>26.0</td><td>11</td><td>4</td><td>enqueues</td><td>0.0</td></tr><tr><th>25</th><td>26.35</td><td>7</td><td>4</td><td>leaves</td><td>9.22525</td></tr><tr><th>26</th><td>26.35</td><td>8</td><td>3</td><td>now being served</td><td>6.34474</td></tr><tr><th>27</th><td>27.49</td><td>12</td><td>4</td><td>enqueues</td><td>0.0</td></tr><tr><th>28</th><td>27.64</td><td>8</td><td>4</td><td>leaves</td><td>7.63665</td></tr><tr><th>29</th><td>27.64</td><td>9</td><td>3</td><td>now being served</td><td>6.88549</td></tr><tr><th>30</th><td>29.06</td><td>13</td><td>4</td><td>enqueues</td><td>0.0</td></tr><tr><th>&vellip;</th><td>&vellip;</td><td>&vellip;</td><td>&vellip;</td><td>&vellip;</td><td>&vellip;</td></tr></tbody></table>"
      ],
      "text/latex": [
       "\\begin{tabular}{r|ccccc}\n",
       "\t& time & cust & qlen & status & wtime\\\\\n",
       "\t\\hline\n",
       "\t& Float64 & Int64 & Int64 & String & Float64\\\\\n",
       "\t\\hline\n",
       "\t1 & 1.2 & 1 & 1 & enqueues & 0.0 \\\\\n",
       "\t2 & 1.2 & 1 & 0 & now being served & 0.0 \\\\\n",
       "\t3 & 5.46 & 2 & 1 & enqueues & 0.0 \\\\\n",
       "\t4 & 5.5 & 3 & 2 & enqueues & 0.0 \\\\\n",
       "\t5 & 6.19 & 1 & 2 & leaves & 4.99532 \\\\\n",
       "\t6 & 6.19 & 2 & 1 & now being served & 0.737497 \\\\\n",
       "\t7 & 7.99 & 4 & 2 & enqueues & 0.0 \\\\\n",
       "\t8 & 8.81 & 2 & 2 & leaves & 3.35581 \\\\\n",
       "\t9 & 8.81 & 3 & 1 & now being served & 3.30971 \\\\\n",
       "\t10 & 12.33 & 5 & 2 & enqueues & 0.0 \\\\\n",
       "\t11 & 12.98 & 3 & 2 & leaves & 7.4733 \\\\\n",
       "\t12 & 12.98 & 4 & 1 & now being served & 4.98585 \\\\\n",
       "\t13 & 13.73 & 4 & 1 & leaves & 5.74268 \\\\\n",
       "\t14 & 13.73 & 5 & 0 & now being served & 1.39837 \\\\\n",
       "\t15 & 15.72 & 6 & 1 & enqueues & 0.0 \\\\\n",
       "\t16 & 17.12 & 7 & 2 & enqueues & 0.0 \\\\\n",
       "\t17 & 17.73 & 5 & 2 & leaves & 5.3967 \\\\\n",
       "\t18 & 17.73 & 6 & 1 & now being served & 2.00988 \\\\\n",
       "\t19 & 20.0 & 8 & 2 & enqueues & 0.0 \\\\\n",
       "\t20 & 20.76 & 9 & 3 & enqueues & 0.0 \\\\\n",
       "\t21 & 23.26 & 6 & 3 & leaves & 7.53774 \\\\\n",
       "\t22 & 23.26 & 7 & 2 & now being served & 6.13554 \\\\\n",
       "\t23 & 25.43 & 10 & 3 & enqueues & 0.0 \\\\\n",
       "\t24 & 26.0 & 11 & 4 & enqueues & 0.0 \\\\\n",
       "\t25 & 26.35 & 7 & 4 & leaves & 9.22525 \\\\\n",
       "\t26 & 26.35 & 8 & 3 & now being served & 6.34474 \\\\\n",
       "\t27 & 27.49 & 12 & 4 & enqueues & 0.0 \\\\\n",
       "\t28 & 27.64 & 8 & 4 & leaves & 7.63665 \\\\\n",
       "\t29 & 27.64 & 9 & 3 & now being served & 6.88549 \\\\\n",
       "\t30 & 29.06 & 13 & 4 & enqueues & 0.0 \\\\\n",
       "\t$\\dots$ & $\\dots$ & $\\dots$ & $\\dots$ & $\\dots$ & $\\dots$ \\\\\n",
       "\\end{tabular}\n"
      ],
      "text/plain": [
       "505×5 DataFrame\n",
       "│ Row │ time    │ cust  │ qlen  │ status           │ wtime    │\n",
       "│     │ \u001b[90mFloat64\u001b[39m │ \u001b[90mInt64\u001b[39m │ \u001b[90mInt64\u001b[39m │ \u001b[90mString\u001b[39m           │ \u001b[90mFloat64\u001b[39m  │\n",
       "├─────┼─────────┼───────┼───────┼──────────────────┼──────────┤\n",
       "│ 1   │ 1.2     │ 1     │ 1     │ enqueues         │ 0.0      │\n",
       "│ 2   │ 1.2     │ 1     │ 0     │ now being served │ 0.0      │\n",
       "│ 3   │ 5.46    │ 2     │ 1     │ enqueues         │ 0.0      │\n",
       "│ 4   │ 5.5     │ 3     │ 2     │ enqueues         │ 0.0      │\n",
       "│ 5   │ 6.19    │ 1     │ 2     │ leaves           │ 4.99532  │\n",
       "│ 6   │ 6.19    │ 2     │ 1     │ now being served │ 0.737497 │\n",
       "│ 7   │ 7.99    │ 4     │ 2     │ enqueues         │ 0.0      │\n",
       "│ 8   │ 8.81    │ 2     │ 2     │ leaves           │ 3.35581  │\n",
       "│ 9   │ 8.81    │ 3     │ 1     │ now being served │ 3.30971  │\n",
       "│ 10  │ 12.33   │ 5     │ 2     │ enqueues         │ 0.0      │\n",
       "⋮\n",
       "│ 495 │ 581.4   │ 168   │ 2     │ now being served │ 11.4506  │\n",
       "│ 496 │ 585.29  │ 168   │ 2     │ leaves           │ 15.3383  │\n",
       "│ 497 │ 585.29  │ 169   │ 1     │ now being served │ 7.90111  │\n",
       "│ 498 │ 587.2   │ 169   │ 1     │ leaves           │ 9.81638  │\n",
       "│ 499 │ 587.2   │ 170   │ 0     │ now being served │ 9.70247  │\n",
       "│ 500 │ 587.98  │ 170   │ 0     │ leaves           │ 10.4767  │\n",
       "│ 501 │ 589.1   │ 171   │ 1     │ enqueues         │ 0.0      │\n",
       "│ 502 │ 589.1   │ 171   │ 0     │ now being served │ 0.0      │\n",
       "│ 503 │ 593.77  │ 171   │ 0     │ leaves           │ 4.67801  │\n",
       "│ 504 │ 598.01  │ 172   │ 1     │ enqueues         │ 0.0      │\n",
       "│ 505 │ 598.01  │ 172   │ 0     │ now being served │ 0.0      │"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<table class=\"data-frame\"><thead><tr><th></th><th>time</th><th>cust</th><th>qlen</th><th>status</th><th>wtime</th></tr><tr><th></th><th>Float64</th><th>Int64</th><th>Int64</th><th>String</th><th>Float64</th></tr></thead><tbody><p>5 rows × 5 columns</p><tr><th>1</th><td>589.1</td><td>171</td><td>1</td><td>enqueues</td><td>0.0</td></tr><tr><th>2</th><td>589.1</td><td>171</td><td>0</td><td>now being served</td><td>0.0</td></tr><tr><th>3</th><td>593.77</td><td>171</td><td>0</td><td>leaves</td><td>4.67801</td></tr><tr><th>4</th><td>598.01</td><td>172</td><td>1</td><td>enqueues</td><td>0.0</td></tr><tr><th>5</th><td>598.01</td><td>172</td><td>0</td><td>now being served</td><td>0.0</td></tr></tbody></table>"
      ],
      "text/latex": [
       "\\begin{tabular}{r|ccccc}\n",
       "\t& time & cust & qlen & status & wtime\\\\\n",
       "\t\\hline\n",
       "\t& Float64 & Int64 & Int64 & String & Float64\\\\\n",
       "\t\\hline\n",
       "\t1 & 589.1 & 171 & 1 & enqueues & 0.0 \\\\\n",
       "\t2 & 589.1 & 171 & 0 & now being served & 0.0 \\\\\n",
       "\t3 & 593.77 & 171 & 0 & leaves & 4.67801 \\\\\n",
       "\t4 & 598.01 & 172 & 1 & enqueues & 0.0 \\\\\n",
       "\t5 & 598.01 & 172 & 0 & now being served & 0.0 \\\\\n",
       "\\end{tabular}\n"
      ],
      "text/plain": [
       "5×5 DataFrame\n",
       "│ Row │ time    │ cust  │ qlen  │ status           │ wtime   │\n",
       "│     │ \u001b[90mFloat64\u001b[39m │ \u001b[90mInt64\u001b[39m │ \u001b[90mInt64\u001b[39m │ \u001b[90mString\u001b[39m           │ \u001b[90mFloat64\u001b[39m │\n",
       "├─────┼─────────┼───────┼───────┼──────────────────┼─────────┤\n",
       "│ 1   │ 589.1   │ 171   │ 1     │ enqueues         │ 0.0     │\n",
       "│ 2   │ 589.1   │ 171   │ 0     │ now being served │ 0.0     │\n",
       "│ 3   │ 593.77  │ 171   │ 0     │ leaves           │ 4.67801 │\n",
       "│ 4   │ 598.01  │ 172   │ 1     │ enqueues         │ 0.0     │\n",
       "│ 5   │ 598.01  │ 172   │ 0     │ now being served │ 0.0     │"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "last(df, 5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Summary Stats:\n",
      "Length:         302\n",
      "Missing Count:  0\n",
      "Mean:           7.486712\n",
      "Minimum:        0.009196\n",
      "1st Quartile:   3.866847\n",
      "Median:         6.409644\n",
      "3rd Quartile:   10.541481\n",
      "Maximum:        23.268310\n",
      "Type:           Float64\n"
     ]
    }
   ],
   "source": [
    "describe(df[df[!, :wtime] .> 0, :wtime])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "In $600$ minutes simulation time, we registered $172$ customers and $505$ status changes. The mean and median waiting times were around $7$ minutes."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<table class=\"data-frame\"><thead><tr><th></th><th>status</th><th>x1</th></tr><tr><th></th><th>String</th><th>Int64</th></tr></thead><tbody><p>4 rows × 2 columns</p><tr><th>1</th><td>enqueues</td><td>167</td></tr><tr><th>2</th><td>now being served</td><td>167</td></tr><tr><th>3</th><td>leaves</td><td>166</td></tr><tr><th>4</th><td>leaves - queue is full!</td><td>5</td></tr></tbody></table>"
      ],
      "text/latex": [
       "\\begin{tabular}{r|cc}\n",
       "\t& status & x1\\\\\n",
       "\t\\hline\n",
       "\t& String & Int64\\\\\n",
       "\t\\hline\n",
       "\t1 & enqueues & 167 \\\\\n",
       "\t2 & now being served & 167 \\\\\n",
       "\t3 & leaves & 166 \\\\\n",
       "\t4 & leaves - queue is full! & 5 \\\\\n",
       "\\end{tabular}\n"
      ],
      "text/plain": [
       "4×2 DataFrame\n",
       "│ Row │ status                  │ x1    │\n",
       "│     │ \u001b[90mString\u001b[39m                  │ \u001b[90mInt64\u001b[39m │\n",
       "├─────┼─────────────────────────┼───────┤\n",
       "│ 1   │ enqueues                │ 167   │\n",
       "│ 2   │ now being served        │ 167   │\n",
       "│ 3   │ leaves                  │ 166   │\n",
       "│ 4   │ leaves - queue is full! │ 5     │"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "by(df, :status, df -> size(df, 1))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Of the $172$ customers, $167$ of them participated in the whole process and were served, but $5$ left beforehand because the queue was full: "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<table class=\"data-frame\"><thead><tr><th></th><th>time</th><th>cust</th><th>qlen</th><th>status</th><th>wtime</th></tr><tr><th></th><th>Float64</th><th>Int64</th><th>Int64</th><th>String</th><th>Float64</th></tr></thead><tbody><p>5 rows × 5 columns</p><tr><th>1</th><td>45.32</td><td>19</td><td>5</td><td>leaves - queue is full!</td><td>-1.0</td></tr><tr><th>2</th><td>249.11</td><td>66</td><td>5</td><td>leaves - queue is full!</td><td>-1.0</td></tr><tr><th>3</th><td>270.04</td><td>74</td><td>5</td><td>leaves - queue is full!</td><td>-1.0</td></tr><tr><th>4</th><td>380.39</td><td>106</td><td>5</td><td>leaves - queue is full!</td><td>-1.0</td></tr><tr><th>5</th><td>382.02</td><td>107</td><td>5</td><td>leaves - queue is full!</td><td>-1.0</td></tr></tbody></table>"
      ],
      "text/latex": [
       "\\begin{tabular}{r|ccccc}\n",
       "\t& time & cust & qlen & status & wtime\\\\\n",
       "\t\\hline\n",
       "\t& Float64 & Int64 & Int64 & String & Float64\\\\\n",
       "\t\\hline\n",
       "\t1 & 45.32 & 19 & 5 & leaves - queue is full! & -1.0 \\\\\n",
       "\t2 & 249.11 & 66 & 5 & leaves - queue is full! & -1.0 \\\\\n",
       "\t3 & 270.04 & 74 & 5 & leaves - queue is full! & -1.0 \\\\\n",
       "\t4 & 380.39 & 106 & 5 & leaves - queue is full! & -1.0 \\\\\n",
       "\t5 & 382.02 & 107 & 5 & leaves - queue is full! & -1.0 \\\\\n",
       "\\end{tabular}\n"
      ],
      "text/plain": [
       "5×5 DataFrame\n",
       "│ Row │ time    │ cust  │ qlen  │ status                  │ wtime   │\n",
       "│     │ \u001b[90mFloat64\u001b[39m │ \u001b[90mInt64\u001b[39m │ \u001b[90mInt64\u001b[39m │ \u001b[90mString\u001b[39m                  │ \u001b[90mFloat64\u001b[39m │\n",
       "├─────┼─────────┼───────┼───────┼─────────────────────────┼─────────┤\n",
       "│ 1   │ 45.32   │ 19    │ 5     │ leaves - queue is full! │ -1.0    │\n",
       "│ 2   │ 249.11  │ 66    │ 5     │ leaves - queue is full! │ -1.0    │\n",
       "│ 3   │ 270.04  │ 74    │ 5     │ leaves - queue is full! │ -1.0    │\n",
       "│ 4   │ 380.39  │ 106   │ 5     │ leaves - queue is full! │ -1.0    │\n",
       "│ 5   │ 382.02  │ 107   │ 5     │ leaves - queue is full! │ -1.0    │"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df[df.wtime .< 0,:]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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IiJya0xmiIiIJHb79m2MGjUKwcHBaNiwId59910kJCRg0qRJAACZTGY2wWRYWBjWrFmjf37hwgU888wzCA8PR0REBAYNGmQ0OaRheTqDBw9GcnKy/rlKpUJqaioaN26MoKAgdOvWzWziSjG+/fZbdOnSBf7+/mjRogXS0tJQWVmpX69QKLBq1So8+eSTCAwMxD333INvvvmm1vuzFZMZIiJyD4IAqG477p+69M5jk5mia/LGG29gz5492Lp1K3bu3Ins7GwUFBTY/PrS0lIkJiYiODgY+/btQ25uLoKDg9G3b1+oVCqbyxkzZgy+//57fPnll/jll18wbNgw9O3bFydOnBD1fgAgIyMDI0eOxKuvvoqjR4/iww8/xJo1azB//nyj7dLS0vD000/jl19+Qf/+/TFixAhcv35d9P7E4HQGRETkHtSlwIJGDtmVHIBR19dpFwHfIJteW1JSgk8++QTr1q1D7969AQBr165FkyZNbN7/l19+CblcjlWrVkEmkwEAVq9ejbCwMGRnZ6NPnz41lvHHH3/giy++wPnz59GoUVW9TZkyBTt27MDq1atFT0I5f/58vPXWWxg9ejQAoEWLFpg3bx5SU1Mxc+ZM/XbJyckYPnw4AGDBggVYsWIFfvzxR/Tt21fU/sRgMkNERCShP/74AyqVCg8//LB+Wf369dGmTRubyygoKMDJkycREhJitLy8vBx//PGHTWUcOnQIgiCgdevWRssrKioQERFhcyyGMR08eNCoJUaj0aC8vBylpaX6ZR07dtQ/DgoKQkhICC5fvix6f2IwmSEiIvegDKxqIXEArVaL4lu3EBoSArlcXrVvGwk2XJKSyWRm26nVaqP9d+nSBZ999pnZaxs0aAAAkMvlNZahUChQUFAAhUJhtF1wcHDNb8SEVqtFWloahgwZYrbO398fJSUlAAClUmm0TiaTQavVit6fGExmyCEEAShVVUIpyBCgVOibTYmIbCaT2Xypp860WkCpqdqfXFz30latWkGpVOLAgQO4++67AQBFRUX4/fffER8fD6AqISksLNS/5sSJE0atG507d8bGjRsRFRWF0NBQi/sxLUOj0eDIkSNITEwEAHTq1AkajQaXL1/Go48+Kuo9WNK5c2ccP34crVq1Mltn72SlJuwATHYnCAKW/arA/fN2o92sDAxbmWfTLxciIncUHByMlJQU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hYVi9uzZ4ty5cynYmrZl1E4AxMqVK5U0jY2NYv78+aJz584iLy9PTJs2TRw7dkyTz9GjR8XUqVNFXl6e6Ny5s5g/f77weDztvDVt6/bbb1fGV7du3cSkSZOUhYwQbKd49IsZtleYfA8Um80mSktLxY033ih2796tvM85K9J7770nysvLhcPhEAMHDhQvvPCC5v10aTNJCCGSd5yHiIiIqH3xnBkiIiLKaFzMEBERUUbjYoaIiIgyGhczRERElNG4mCEiIqKMxsUMERERZTQuZoiIiCijcTFDRElRXV0NSZJQV1fX7mVLkgRJklBcXJyUvN55552E08vbLUkSbrjhhlaXT0TmcTFDRKZVVFRg0aJFmtfGjBmDkydPoqioKCV1WrlyJfbv39/qfE6ePKmJrhyPvN0zZ85sddlE1DI5qa4AEWUHu92uRNFNheLiYnTv3r3V+ZjdBnm78/Ly4PV6W10+EZnHIzNEZMptt92GmpoarFixQvl55ciRIxE/M/3Xf/0XiouL8f777+Oyyy6D0+nE9OnT4XK58Morr6Bfv34oKSnBPffcg+bmZiV/n8+H++67DxdddBHy8/MxcuRIVFdXm67n0qVLceWVV+Lll1/GxRdfjIKCAtx1111obm7GH//4R/Ts2RPdu3fHo48+qvmc+memI0eOQJIkrF69GhMnToTT6cTQoUOxcePGljcgESUdj8wQkSkrVqzA/v37UV5ejkceeQQA0K1bNxw5ciQirdvtxrPPPotVq1ahoaEBN954I2688UYUFxdjzZo1OHToEP793/8dY8eOxU033QQA+MUvfoEjR45g1apVKC0txdtvv43rrrsOO3fuRP/+/U3V9euvv8aHH36Ijz76CF9//TWmT5+Ow4cPY8CAAaipqcGGDRtw++23Y9KkSRg1alTUfB566CE8+eST6N+/Px566CHMmjULBw8eRE4Op1CidMCRSESmFBUVwW63w+l0xv1Jxu/3o7KyEpdeeikAYPr06Xjttdfw3XffoaCgAIMGDcLEiROxbt063HTTTfj666/xxhtv4Pjx4ygtLQUALF68GB999BFWrlyJxx57zFRdA4EAXn75ZRQWFipl7du3D2vWrIHFYsFll12GJ554AtXV1TEXM4sXL8bUqVMBAA8//DAGDx6MgwcPYuDAgabqQ0Rtg4sZImozTqdTWcgAQI8ePdCvXz8UFBRoXqutrQUAbN++HUIIDBgwQJOP1+tFly5dTJffr18/FBYWasqyWq2wWCya1+Tyo7niiiuUx7169QIA1NbWcjFDlCa4mCGiNmOz2TTPJUkyfC0QCAAIHkmxWq3Ytm0brFarJp16AdRW5SeSjyRJSl2JKD1wMUNEptntds1Ju8ly1VVXobm5GbW1tRg3blzS8yei7MSrmYjItH79+mHz5s04cuQITp8+nbSjFAMGDMDs2bNx6623YvXq1Th8+DC2bt2KJ554AmvWrElKGUSUfbiYISLTFi9eDKvVikGDBqFbt244duxY0vJeuXIlbr31VvzmN7/BZZddhp/+9KfYvHkz+vTpk7QyiCi7SEIIkepKEBG1hiRJePvtt1MaTuC2225DXV2dqVAIRJQcPDJDRFlh1qxZ6N27d7uXu379ehQUFOBvf/tbu5dNREE8MkNEGe/gwYMAAKvVirKysnYtu7GxESdOnAAQvOIqlSEdiDoqLmaIiIgoo/FnJiIiIspoXMwQERFRRuNihoiIiDIaFzNERESU0biYISIioozGxQwRERFlNC5miIiIKKNxMUNEREQZjYsZIiIiymj/H26zLvKcHMecAAAAAElFTkSuQmCC",
      "text/plain": [
       "Figure(PyObject <Figure size 640x480 with 1 Axes>)"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "using PyPlot\n",
    "step(df.time, df.wtime)\n",
    "step(df.time, df.qlen)\n",
    "axhline(y=0, color=\"k\")\n",
    "grid()\n",
    "xlabel(\"time [min]\")\n",
    "ylabel(\"wait time [min], queue length\")\n",
    "title(\"Waiting Time in the Post Office\")\n",
    "legend([\"wait_time\", \"queue_len\"]);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Many customers had waiting times of more than 10, 15 up to even more than 20 minutes. The negative waiting times were the 5 customers, which left because the queue was full.\n",
    "\n",
    "So many customers will remain angry. If this is the situation all days, our post office will have an evil reputation. What should we do?\n",
    "\n",
    "## Conclusion\n",
    "\n",
    "Even if our process runs within predetermined bounds (queue length, customer wishes …), it seems to fluctuate wildly and to produce unpredicted effects. We see here the **effects of variation** in arrivals, in demands and in serving time on system performance. In this case 10% extra capacity is not enough to provide enough buffer for variation and for customer service – even if our post clerk is the most willing person.\n",
    "\n",
    "Even for such a simple everyday system, we cannot say beforehand – without reality check – which throughput, waiting times, mean queue length, capacity utilization or customer satisfaction will emerge. Even more so for more complicated systems in production, service, projects and supply chains with multiple dependencies.\n",
    "\n",
    "If we had known the situation beforehand, we could have provided standby for our clerk or install an automatic stamp dispenser for cutting the short tasks … \n",
    "\n",
    "We should have done a simulation. We should have known `DiscreteEvents` before …  😄"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "@webio": {
   "lastCommId": null,
   "lastKernelId": null
  },
  "kernelspec": {
   "display_name": "Julia 1.2.0",
   "language": "julia",
   "name": "julia-1.2"
  },
  "language_info": {
   "file_extension": ".jl",
   "mimetype": "application/julia",
   "name": "julia",
   "version": "1.2.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
